import globals from 'globals';
import pluginJs from '@eslint/js';
import pluginVue from 'eslint-plugin-vue';
import vueParser from 'vue-eslint-parser';
import pluginTs from '@typescript-eslint/eslint-plugin';
import tsParser from '@typescript-eslint/parser';
import pluginReact from 'eslint-plugin-react';

/** @type {import('eslint').ESLint.ConfigData[]} */
export default [
  {
    ignores: [
      // 忽略所有 dist 目录
      '**/dist/**',
      // 忽略 node_modules
      '**/node_modules/**',
    ],
  },
  // js 配置
  {
    files: ['**/*.js'],
    languageOptions: {
      globals: { ...globals.browser }, // 启用浏览器全局变量，ts、tsx文件不用启用是因为typeScript 的类型系统已声明 window（lib: [dom]）,且在eslint配置中也关联了tsconfig.json。对于vue文件， @vue/eslint-plugin-vue 在解析 .vue 文件时，默认启用了浏览器环境全局变量（如 window、document）
    },
    plugins: {
      '@eslint': pluginJs, // 启用 TypeScript 插件
    },
    rules: {
      ...pluginJs.configs.recommended.rules,
      'no-console': 'warn',
    },
  },
  // ts配置
  {
    files: ['**/*.ts'],
    ignores: ['src/node/**/*.ts'],
    languageOptions: {
      parser: tsParser,
      parserOptions: {
        projectService: {
          allowDefaultProject: ['eslint.config.mjs'],
          defaultProject: './tsconfig.json',
        },
        project: ['./tsconfig.json'],
      },
    },
    plugins: {
      '@typescript-eslint': pluginTs, // 启用 TypeScript 插件
    },
    rules: {
      ...pluginTs.configs.recommended.rules,
      ...pluginTs.configs['recommended-type-checked'].rules,
    },
  },
  // vue 配置
  {
    files: ['**/*.vue'],
    languageOptions: {
      parser: vueParser,
      parserOptions: {
        parser: tsParser,
        projectService: {
          allowDefaultProject: ['eslint.config.mjs'],
          defaultProject: './tsconfig.json',
        },
        extraFileExtensions: ['.vue'], // 新增
        project: ['./tsconfig.json'],
      },
    },
    plugins: {
      '@typescript-eslint': pluginTs, // 启用 TypeScript 插件
      vue: pluginVue, // 启用 Vue 插件
    },
    rules: {
      ...pluginTs.configs.recommended.rules,
      ...pluginTs.configs['recommended-type-checked'].rules,
      // ...pluginVue.configs.essential.rules,
      ...pluginVue.configs['vue3-essential'].rules,
      'vue/multi-word-component-names': 'off',
    },
  },
  // react 配置
  {
    files: ['**/*.tsx'],
    languageOptions: {
      parser: tsParser,
      parserOptions: {
        projectService: {
          allowDefaultProject: ['eslint.config.mjs'],
          defaultProject: './tsconfig.json',
        },
        ecmaFeatures: {
          jsx: true,
        },
        project: ['./tsconfig.json'],
      },
    },
    plugins: {
      '@typescript-eslint': pluginTs, // 启用 TypeScript 插件
      react: pluginReact,
    },
    rules: {
      ...pluginTs.configs.recommended.rules,
      ...pluginTs.configs['recommended-type-checked'].rules,
      ...pluginReact.configs.recommended.rules,
      'react/react-in-jsx-scope': 'off',
    },
  },
  // node 相关配置
  {
    files: ['src/node/**/*.ts'], // 路径前面不能加 ‘/’，不然识别不到
    languageOptions: {
      globals: globals.node,
      parser: tsParser,
      parserOptions: {
        project: ['./tsconfig.json'], // 必须加这个识别ts配置
      },
    },
    plugins: {
      '@typescript-eslint': pluginTs, // 启用 TypeScript 插件
    },
    rules: {
      ...pluginTs.configs.recommended.rules,
      ...pluginTs.configs['recommended-type-checked'].rules,
    },
  },
  // 公共配置
  {
    rules: {
      'no-shadow': 'error',
      'no-unused-vars': [
        'error',
        {
          args: 'all', // 所有参数都必须使用
          argsIgnorePattern: '^_', // 允许以_开头的参数名
          caughtErrors: 'all', // 连catch错误变量也必须使用
        },
      ],
    },
  },
];
